home *** CD-ROM | disk | FTP | other *** search
/ Qu.......ke Neue Level / KroGer Software GmbH - Qu_ke.iso / UTILITY / PRG8.ZIP / REWAD.C < prev    next >
C/C++ Source or Header  |  1996-03-01  |  4KB  |  108 lines

  1. /*
  2.  * Rewad.c - Uses the routines in the QEU library to re-create a
  3.  *           Doom/Heretic/Hexen WAD file from a list of separate files.
  4.  *
  5.  * Do whatever you want with this file, but don't blame me if
  6.  * something doesn't work.  If you manage to destroy your hard disk
  7.  * with it, that's too bad for you...  Use it at your own risks!
  8.  */
  9.  
  10. #include "qeu.h"
  11. #include "q_misc.h"
  12. #include "q_files.h"
  13. #include "f_wad.h"
  14.  
  15. void main(int argc, char *argv[])
  16. {
  17.   char      *filename;
  18.   FILE      *file;
  19.   FILE      *srcfile;
  20.   int        ftype;
  21.   WADDirPtr  dir;
  22.   UInt16     dirsize;
  23.   char      *indexname = NULL;
  24.   UInt32     size, count;
  25.   char      *entryname;
  26.  
  27.   /* read the parameters... */
  28.   for (argv++, argc--; argc && **argv == '-'; argv++, argc--)
  29.     if ((*argv)[1] == 'h')
  30.       {
  31.     fprintf(stderr, "REWAD %s by Raphael Quinet\n\n", QEU_VERSION);
  32.     fprintf(stderr, "Usage: rewad [-h] [-i <indexfile>] file.wad [entryname...]\n");
  33.     fprintf(stderr, "       -h  -- display this help screen\n");
  34.     fprintf(stderr, "       -i  -- get the list of files from the specified index file\n");
  35.     fprintf(stderr, "Rewad will create a WAD file containing all the files specified on the\n");
  36.     fprintf(stderr, "command line, or append them to the WAD file if it already exists\n");
  37.     fprintf(stderr, "If the -i option is used, the list of files is read from the specified\n");
  38.     fprintf(stderr, "index file (usually %s, as created by unwad).\n", QEU_INDEX_FILE);
  39.     exit(1);
  40.       }
  41.     else if ((*argv)[1] == 'i' && argc-- > 1)
  42.       indexname = *++argv;
  43.     else
  44.       ProgError("Invalid argument (%s).  Use rewad -h for help.", *argv);
  45.   if (argc <= 0)
  46.     ProgError("Missing argument.  Use rewad -h for help.");
  47.   filename = *argv;
  48.   if (indexname == NULL && argc < 2)
  49.     ProgError("List of files missing.  Use rewad -h for help.");
  50.  
  51.   /* check if the file exists */
  52.   file = OpenFileReadMagic(filename, &ftype);
  53.   if (file == NULL)
  54.     {
  55.       /* create a new PWAD file */
  56.       file = fopen(filename, "wb");
  57.       if (file == NULL)
  58.     ProgError("Cannot create file (%s)", filename);
  59.       if (WriteWADHeader(file, &count, &dir, &dirsize, TRUE) == FALSE)
  60.     ProgError("Cannot write WAD file header");
  61.     }
  62.   else
  63.     {
  64.       /* append to an existing WAD file */
  65.       if (ftype != FTYPE_PWAD && ftype != FTYPE_IWAD)
  66.     ProgError("File is not a WAD file (%s)", filename);
  67.       dir = ReadWADDirectory(file, 0L, &dirsize);
  68.       if (dir == NULL)
  69.     ProgError("Cannot read main directory from %s", filename);
  70.       /* re-open file for writing */
  71.       fclose(file);
  72.       file = fopen(filename, "r+b");
  73.       count = dir[dirsize - 1].offset + dir[dirsize - 1].size;
  74.       if (file == NULL || fseek(file, count, SEEK_SET) < 0)
  75.     ProgError("Cannot re-open file for writing (%s)", filename);
  76.     }
  77.  
  78.   /* parse the index file and read all the files listed in it */
  79.   if (indexname != NULL)
  80.     ProgError("Option -i not implemented yet.  Sorry...\n"); /*! missing */
  81.  
  82.   /* if there are extra arguments on the command line, read these files too */
  83.   for (argv++, argc--; argc; argv++, argc--)
  84.     {
  85.       entryname = QStrNDupHack(*argv, 8);
  86.       srcfile = fopen(*argv, "rb");
  87.       if (srcfile == NULL)
  88.     ProgError("File not found (%s)", *argv);
  89.       size = GetFileSize(srcfile);
  90.       printf("Copying %lu bytes from %s\n", size, *argv);
  91.       if (CopyBytes(file, srcfile, size) == FALSE)
  92.     ProgError("Cannot copy data");
  93.       if (AddWADEntry(file, &count, &dir, &dirsize, entryname, size) == FALSE)
  94.     ProgError("Cannot register entry in WAD directory (%s)", entryname);
  95.       fclose(srcfile);
  96.     }
  97.  
  98.   /* write the directory */
  99.   size = WriteWADDirectory(file, &count, dir, dirsize);
  100.   if (size == 0L)
  101.     ProgError("Cannot write WAD directory");
  102.   printf("Total size of %s: %lu bytes\n", filename, size);
  103.  
  104.   /* close the file and say goodbye */
  105.   fclose(file);
  106.   exit(0);
  107. }
  108.